/*******************************************************************************
 * Classe ProjectileSimple : classe de création et de gestion du projectile de
 *                           base, le projectile simple.
 ******************************************************************************/
package prjintwg;

import Armes.Arme;
import Armes.SousBombe;
import ElementsDeJeu.MessageSpecial;
import ElementsDeJeu.Microphone;
import ElementsDeJeu.Personnage;
import java.awt.*;
import java.util.logging.*;
import javax.swing.JOptionPane;

/**
 *
 * @author W&G
 */
public class ProjectileSimple extends Arme {

    protected ThreadDeplacement thread;//Processus de déplacement
    protected int rayonExplosion = 12;//rayon d'explosion du projectile
    protected SetMonDecorTrue setDecorTrue;//
    protected Repaint repaint;//objet pour redessiner le paneau
    protected MessageSpecial mS;//message special a dessiner
    //processus de l'explosion du projectile
    protected Thread threadExplosion = new ThreadExplosion();
    protected int index = 1;//Index de l'explosion a utiliser
    protected int dernierePosX;//Derniere position en x
    protected int dernierePosY;//Derniere position en y
    protected Microphone microphone;//Microphone pour capter et jouer le son
/**
 * Constructeur du projectile simple
 * @param positionX position en x du projectile
 * @param positionY position en y du projectile
 * @param pnlJeu panneau contenant le jeu
 */
    public ProjectileSimple(int positionX, int positionY, PnlJeu pnlJeu) {
        this.positionX = positionX;
        this.positionY = positionY;
        this.pnlJeu = pnlJeu;
        this.puissance = 1.0;
        if (pnlJeu.getVisee() != null && !this.getClass().equals(SousBombe.class)) {
            pnlJeu.getVisee().setPosition(positionX, positionY, Jeu.getTourTir());
        }
        microphone = new Microphone(pnlJeu, 0);
    }
/**
 * Premiere action speciale de l'arme
 */
    public void actionSpeciale1() {
    }
/**
 * Deuxieme action speciale de l'arme
 */
    public void actionSpeciale2() {
    }

    @Override
    public void paintComponent(Graphics g) {//Dessine l'arme
        g.setColor(new Color(255, 80, 0));
        g.fillOval(this.positionX, TAILLEFENETRE - this.positionY, 10, 10);

    }
/**
 * Retourne le processus de déplacement
 * @return retourne le processus de déplacement
 */
    public ThreadDeplacement getThread() {
        return thread;
    }
/**
 * Déplace le projectile
 */
    public void deplacement() {
        jeu = pnlJeu.getF().getJeu();
        thread = new ThreadDeplacement();
        thread.start();
    }
/**
 * Vérifie s'il y a collision ou non
 * @param projectile projectile à vérifier
 * @return retourne vrai si collision et faux sinon
 */
    protected boolean collision(ProjectileSimple projectile) {
        if (!estEnDehors(projectile)) {
            if (pnlJeu.getMonDecor().getTerrain()[projectile.positionX / 2][projectile.positionY]) {
                return true;
            } else {
                return false;
            }
        } else {
            if (projectile.positionY < 200) {
                return true;
            } else {
                return false;
            }
        }
    }
/**
 * Vérifie la collision avec les personnages
 * @param p personnage a vérifier
 * @param projectile projectile a vérifier
 * @return vrai si touche le personnage, faux sinon
 */
    protected boolean touche(Personnage p, ProjectileSimple projectile) {
        if (!collision(this)) {
            if ((positionX >= p.getPosX() - 16 && positionX <= (p.getPosX())) && (positionY <= p.getPosY() && positionY >= (p.getPosY() - 32))) {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }

    }
/**
 * Vérifie si le projectile est en dehors de l'écran
 * @param projectile projectile a vérifier
 * @return vrai si en dehors et faux sinon
 */
    protected boolean estEnDehors(ProjectileSimple projectile) {
        if (positionX > 1070 || positionX < 0 || positionY > 358 || positionY < 0) {

            return true;
        } else {
            return false;
        }
    }
/**
 * Retourne la derniere position en x
 * @return retourne la derniere position en x
 */
    public int getDernierePosX() {
        return dernierePosX;
    }
/**
 * retourne la derniere position en y
 * @return retourne la derniere position en y
 */
    public int getDernierePosY() {
        return dernierePosY;
    }
/**
 * Met le decor en jeu
 */
    protected class SetMonDecorTrue extends Thread {

        @Override
        public void run() {
            pnlJeu.getMonDecor().setEnJeu(true);
        }
    }
/**
 * Processus pour repeindre le panneau
 */
    protected class Repaint extends Thread {

        @Override
        public void run() {
            pnlJeu.getF().repaint();
        }
    }
/**
 * Processus d'explosion
 */
    protected class ThreadExplosion extends Thread {

        int max = 10;

        @Override
        public void run() {
            max = pnlJeu.getProjectile().getVolume();
            for (int i = 0; i <= max + 20; i = i + 3) {
                pnlJeu.getExplosion(index).setPosSize(positionX - 20 - i * max / 20, pnlJeu.getF().getHeight() - positionY - i * max / 20 - rayonExplosion, 40 + i * max / 10, 40 + i * max / 10);
                pnlJeu.getF().repaint(positionX - max * 4 - 20,
                        pnlJeu.getF().getHeight() - positionY - max * 3, max * 8 + 40, max * 8 + 40);
                try {
                    sleep(40);
                } catch (InterruptedException ex) {
                }
            }
            pnlJeu.getExplosion(index).setPosSize(-50, -50, 40, 40);
            pnlJeu.getF().repaint();
        }
    }
    protected void personnage1Touche(){
                                try {
                            if (Jeu.getTourTir() % 2 == 1) {
                                microphone.playSound("ouch.wav");
                                mS = new MessageSpecial("Ouch.PNG");
                            } else {
                                microphone.playSound("EpicFail.wav");
                                mS = new MessageSpecial("EpicFail.PNG");
                            }
                        } catch (Exception e) {
                            System.out.println("Erreur de chargement du message spécial");
                        }
    }
    protected void personnage2Touche(){
                            try {
                            if (Jeu.getTourTir() % 2 == 0) {
                                microphone.playSound("ouch.wav");
                                mS = new MessageSpecial("Ouch.PNG");
                            } else {
                                microphone.playSound("EpicFail.wav");
                                mS = new MessageSpecial("EpicFail.PNG");
                            }
                        } catch (Exception e) {
                            System.out.println("Erreur de chargement du message spécial");
                        }
    }
    protected void personneTouche(){
                        try {
                        mS = new MessageSpecial("Fail.PNG");
                        microphone.playSound("fail.wav");
                    } catch (Exception e) {
                        System.out.println("Erreur de chargement du message spécial");
                        System.out.println(e);
                    }
    }
/**
 * Processus de déplacement
 */
    protected class ThreadDeplacement extends Thread {

        private boolean stopThread = false;

        @Override
        public void run() {
            pnlJeu.getBtnDeplacement().setEnabled(false);
            pnlJeu.getCboArmes().setEnabled(false);
            actionSpeciale1();
            repaint = new Repaint();
            setDecorTrue = new SetMonDecorTrue();
            repaint.setPriority(MAX_PRIORITY);
            setDecorTrue.setPriority(MIN_PRIORITY);
            repaint.start();
            while (repaint.isAlive()) {
            }
            setDecorTrue.start();
            while (setDecorTrue.isAlive()) {
            }
            try {
                while (!collision(pnlJeu.getProjectile()) && !touche(pnlJeu.getPersonnage2(), pnlJeu.getProjectile()) && !touche(pnlJeu.getPersonnage1(), pnlJeu.getProjectile()) && testFin()) {
                    pnlJeu.getF().repaint(positionX - 50, pnlJeu.getF().getHeight() - positionY - 25, 100, 100);
                    calculerMouvement();
                    sleep(10);
                }

                getVolume();

                if (!estEnDehors(pnlJeu.getProjectile()) && positionY > 0
                        && !touche(pnlJeu.getPersonnage2(), pnlJeu.getProjectile()) && !touche(pnlJeu.getPersonnage1(), pnlJeu.getProjectile())) {
                    jeu.explosion(rayonExplosion, pnlJeu.getProjectile(), null);

                }
                pnlJeu.personnage1Touche(endommager(pnlJeu.getPersonnage1()), 0, pnlJeu.getPersonnage2().getForce());
                pnlJeu.personnage2Touche(endommager(pnlJeu.getPersonnage2()), 0, pnlJeu.getPersonnage1().getForce());

                if (touche(pnlJeu.getPersonnage1(), pnlJeu.getProjectile())) {
                    pnlJeu.personnage1Touche((int) (puissance * 100), 1000, pnlJeu.getPersonnage2().getForce());
                    if (pnlJeu.getPersonnage1().getPv() > 0) {
                        personnage1Touche();
                        mS.setBounds(350, 100, 330, 125);
                                     pnlJeu.add(mS);
                    }
                } else if (touche(pnlJeu.getPersonnage2(), pnlJeu.getProjectile())) {
                    pnlJeu.personnage2Touche((int) (puissance * 100), 1000, pnlJeu.getPersonnage1().getForce());
                    if (pnlJeu.getPersonnage2().getPv() > 0) {
                    personnage2Touche();
                    mS.setBounds(350, 100, 330, 125);
                                     pnlJeu.add(mS);
                    }

                } else {
                personneTouche();
                mS.setBounds(350, 100, 330, 125);
                                     pnlJeu.add(mS);
                }
                dernierePosX = positionX;
                dernierePosY = positionY;
                actionSpeciale2();
                //  pnlJeu.getF().repaint(positionX - 50, pnlJeu.getF().getHeight() - positionY - 25, 100, 100);
                threadExplosion.start();

               
                pnlJeu.getMonDecor().setEnJeu(false);

                pnlJeu.getF().repaint(positionX - 50,
                        pnlJeu.getF().getHeight() - positionY - 25, 100, 100);
                if (pnlJeu.getPersonnage1().getPv() <= 0 || pnlJeu.getPersonnage2().getPv() <= 0) {
                    try {
                        microphone.playSound("Destroyed.wav");
                        mS = new MessageSpecial("Destroyed.PNG");
                        mS.setBounds(300, 100, 440, 160);
                        pnlJeu.add(mS);
                        sleep(1000);
                        switch (JOptionPane.showConfirmDialog(null, "Voulez vous recommencer ?")) {
                            case 0:
                                pnlJeu.remove(mS);
                                pnlJeu.mettreAZero();
                                break;
                            case 1:
                                pnlJeu.remove(mS);
                                pnlJeu.mettreAZero();
                                pnlJeu.getF().afficherMenuPrincipal();
                                break;
                            case 2:
                                pnlJeu.remove(mS);
                                pnlJeu.mettreAZero();
                                pnlJeu.getF().afficherMenuPrincipal();
                                break;
                            case -1:
                                pnlJeu.remove(mS);
                                pnlJeu.mettreAZero();
                                pnlJeu.getF().afficherMenuPrincipal();
                                break;
                            default:
                                pnlJeu.getBtnDeplacement().setEnabled(false);
                        }
                    } catch (Exception e) {
                        System.out.println("Erreur de chargement du message spécial");
                    }
                }
                pnlJeu.nouveauProjectile();
                pnlJeu.getF().repaint();
                try {
                    sleep(1000);
                    pnlJeu.remove(mS);
                } catch (Exception ex) {
                    Logger.getLogger(Jeu.class.getName()).log(Level.SEVERE, null, ex);
                }
                pnlJeu.getCboArmes().setEnabled(true);

                pnlJeu.getF().repaint();

            } catch (InterruptedException ie) {
                System.out.println("Erreur de déplacement");
            }

        }
/**
 * Interrompt le processus
 * @return retourne vrai quand le processus est arrêté
 * @throws InterruptedException Interruption du processus
 */
        public synchronized boolean testFin() throws InterruptedException {
            if (stopThread) {
                throw new InterruptedException();
            }
            return true;
        }
/**
 * Met la valeur de l'arret du processus à vrai
 */
        public void stopThread() {
            this.stopThread = true;
        }
    }
}
